//配置路由
import Vue from 'vue'
import VueRouter from 'vue-router'
//引入store
import store from '../store'
//使用插件
Vue.use(VueRouter)
import routes from './routes'
//先把VueRouter原型对象的push、replace，先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace

//重写push||replace
//第一个参数：告诉原来push方法，你往哪里跳转（传递那些参数）
//第二个参数：成功回调
//第三个参数：失败回调
//call||apply区别
//相同点：都可以调用函数一次，都可以篡改函数的上下文一次
//不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组
VueRouter.prototype.push = function (location, reslove, reject){
    if (reslove && reject) {
        originPush.call(this, location, reslove, reject)
    } else{
        originPush.call(this, location, () => { }, () => {})
    }
}

VueRouter.prototype.replace = function (location, reslove, reject){
    if (reslove && reject) {
        originReplace.call(this, location, reslove, reject)
    } else{
        originReplace.call(this, location, () => { }, () => {})
    }
}

//对外暴露VueRouter类的实例
let router = new VueRouter({
    //配置路由
    //第一:路径的前面需要有/(不是二级路由)
    //路径中单词都是小写的
    //component右侧V别给我加单引号【字符串：组件是对象（VueComponent类的实例）】
    routes,
    //滚动行为
    scrollBehavior(to, from, savedPosition) {
      //返回的这个y=0，代表的滚动条在最上方
      return { y: 0 };
    },
  });

//全局守卫：前置守卫（在路由跳转之间进行判断）
router.beforeEach(async (to, from, next) => {
    // to and from are both route objects. must call `next`.
    //to：可以获取到你要跳转到那个路由信息
    //from：可以获取到你从哪个路由而来的信息
    //next：放行函数 next() 放行 next(path)放行到指定的路由
    //用户登录了，才会有token，未登录一定没有
    let token = store.state.user.token
    //用户信息
    let name = store.state.user.userInfo.name
    if(token){
        //用户已经登录了还想去login【不能去，停留在首页】
        if (to.path == '/login') {
            next('/home')
            //console.log(1111);
        }else{
            //用户已经登录，去的不是login【home|search|detail|shopcart】，访问的是非登录与注册
            //如果用户名已有
            if (name) {
                next()
                //console.log(2222);
            }else{
                //登录了且没有用户信息
                //没有用户信息，在路由跳转之前派发action让仓库存储用户信息再跳转
                try {
                    //获取用户信息成功
                    await store.dispatch('getUserInfo')
                    //放行
                    next()
                    //console.log(3333);
                } catch (error) {
                    //token失效了，获取不到用户信息，需要重新登录---清除token
                    await store.dispatch('userLogout')
                    next('/login')
                }
            }
        }
    }else{
        //未登录(不能去交易相关、支付相关【pay、paysuccess】、不能不个人中心)
        //未登录去上面这些路由=====登录
        let toPath = to.path;
        if(toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay')!=-1||toPath.indexOf('/center')!=-1){
          //把未登录的时候向去而没有去成的信息，存储于地址栏中【路由】
          next('/login?redirect='+toPath);
        }else{
           //去的不是上面这些路由（home|search|shopCart）---放行
           next();
        }
    }
})

export default router